package cn.guat.smartpark.utils;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Fastjson2CoordinateParser {

    /**
     * 解析坐标字符串为Map集合（基于Fastjson2）
     */
    public static Map<String, Object> parseCoordinate(String jsonStr) {
        // 1. 解析JSON字符串为JSONObject
        JSONObject jsonObject = JSON.parseObject(jsonStr);

        // 2. 提取type
        String type = jsonObject.getString("type");

        // 3. 提取coordinates并转换为对应结构
        JSONArray coordinatesArray = jsonObject.getJSONArray("coordinates");
        Object coordinates;

        if ("Point".equals(type)) {
            // Point：JSONArray -> List<Double>
            coordinates = parsePointCoordinates(coordinatesArray);
        } else if ("LineString".equals(type)) {
            // LineString：JSONArray -> List<List<Double>>
            coordinates = parseLineStringCoordinates(coordinatesArray);
        } else {
            throw new IllegalArgumentException("不支持的类型：" + type);
        }

        // 4. 组装为Map
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("type", type);
        resultMap.put("coordinates", coordinates);
        return resultMap;
    }

    /**
     * 解析Point类型的coordinates（单个坐标点）
     */
    private static List<Double> parsePointCoordinates(JSONArray array) {
        List<Double> coordinates = new ArrayList<>();
        for (int i = 0; i < array.size(); i++) {
            coordinates.add(array.getDouble(i));
        }
        return coordinates;
    }

    /**
     * 解析LineString类型的coordinates（多个坐标点）
     */
    private static List<List<Double>> parseLineStringCoordinates(JSONArray array) {
        List<List<Double>> coordinates = new ArrayList<>();
        for (int i = 0; i < array.size(); i++) {
            // 每个元素是一个坐标点的JSONArray，转为List<Double>
            JSONArray pointArray = array.getJSONArray(i);
            coordinates.add(parsePointCoordinates(pointArray));
        }
        return coordinates;
    }
}